1、最近做項(xiàng)目遇到,C#調(diào)用C++dll里的函數(shù)需要傳遞結(jié)構(gòu)體參數(shù),發(fā)現(xiàn)這個(gè)并不是簡單的在C#里定義相應(yīng)的結(jié)構(gòu)體就可以的,下面以一個(gè)例子來說明解決的辦法,C++中的函數(shù)和結(jié)構(gòu)體如下:
uint msec_set_igr_gen_cfg(int port, IGR_GEN_T *igr_gen)
{
return 0;
}
typedef struct {
? int aa_disable; /*/< authentiation adjust checking disable */
? int badtag_rej; /*/< reject packet if it is bypassed due to badtag */
? int pad_en; /*/< pad non-rejected packets up to 64B */
? int byp_ctl_sl; /*/< bypass packet if SL field does not correspond to packet len */
? int byp_ctl_v; /*/< bypass packet if V bit is set */
? int byp_ctl_sc; /*/< bypass packet if SC bit and either ES or SCB bits are set */
? int byp_ctl_ec; /*/< bypass packet if DC bits are not 00 or 11 */
? int sectag_flag; /*/< select which flag bit indicates that a SEC tag was present in pkt */
} IGR_GEN_T;
在C#中 首先需要使用Dllimport將相應(yīng)的C++dll load進(jìn)來,然后定義相應(yīng)的結(jié)構(gòu)體,具體如下:
? ? ? ? [DllImport("..\\debug\\mgd_MacSec.dll")]
? ? ? ? private static extern UInt32 msec_set_igr_gen_cfg(int port, IntPtr igr_gen);
??
? ? ? ? 結(jié)構(gòu)體定義:
? ? [StructLayout(LayoutKind.Sequential)]
? ? ?public class IGR_GEN_T?
? ? ?{
? ? ? ? ?int aa_disable; /*/< authentiation adjust checking disable */
? ? ? ? ?int badtag_rej; /*/< reject packet if it is bypassed due to badtag */
? ? ? ? ?int pad_en; /*/< pad non-rejected packets up to 64B */
? ? ? ? ?int byp_ctl_sl; /*/< bypass packet if SL field does not correspond to packet len */
? ? ? ? ?int byp_ctl_v; /*/< bypass packet if V bit is set */
? ? ? ? ?int byp_ctl_sc; /*/< bypass packet if SC bit and either ES or SCB bits are set */
? ? ? ? ?int byp_ctl_ec; /*/< bypass packet if DC bits are not 00 or 11 */
? ? ? ? ?int sectag_flag; /*/< select which flag bit indicates that a SEC tag was present in pkt */
? ? ? ? ?public IGR_GEN_T()
? ? ? ? ?{
? ? ? ? ? ? ?aa_disable = 0;
? ? ? ? ? ? ?badtag_rej = 0;
? ? ? ? ? ? ?pad_en = 0;
? ? ? ? ? ? ?byp_ctl_ec = 0;
? ? ? ? ? ? ?byp_ctl_sc = 0;
? ? ? ? ? ? ?byp_ctl_sl = 0;
? ? ? ? ? ? ?byp_ctl_v = 0;
? ? ? ? ? ? ?sectag_flag = 0;
? ? ? ? ?}
? ? ?} ;
? 在代碼中具體引用函數(shù)時(shí)如下所示,
? ? ?IntPtr ptr = Marshal.AllocHGlobal(Marshal.SizeOf(igr_gen));
? ? ? ? ? ? ?Marshal.StructureToPtr(igr_gen, ptr, false);
? ? ? ? ? ? ?UInt32 ret = _msec_set_igr_gen_cfg(port, ptr);
? ? ? ? ? ? ?igr_gen = (IGR_GEN_T)Marshal.PtrToStructure(ptr, typeof(IGR_GEN_T));
? ? ? ? ? ? ?Marshal.FreeHGlobal(ptr);
? ? ? ? ? ? ?return ret;
從以上步驟可以看出,結(jié)構(gòu)體參數(shù)的傳遞需要marshal做輔助做相應(yīng)的轉(zhuǎn)化,以intptr的方式傳輸結(jié)構(gòu)體參數(shù)。
?